/**************************************************************************************
实验名称：SG90舵机实验
接线说明：SG90舵机模块-->单片机IO
		  橙色(信号线)-->P21
		  红色(电源正)-->5V
		  褐色(电源负)-->GND

		  独立按键模块-->单片机IO
		  K1-->P31
		  K2-->P30
		  	
实验现象：下载程序后，按下K1键控制舵机正转，按下K2键控制舵机反转
注意事项：																				  
***************************************************************************************/
#include "public.h"
typedef unsigned int u16;	
typedef unsigned char u8;

sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

sbit LED1=P2^0;

#define KEY1_PRESS	1
#define KEY2_PRESS	2
#define KEY3_PRESS	3
#define KEY4_PRESS	4
#define KEY_UNPRESS	0	

void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

u8 key_scan(u8 mode)
{
	static u8 key=1;

	if(mode)key=1;
	if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
	{
		delay_10us(1000);
		key=0;
		if(KEY1==0)
			return KEY1_PRESS;
		else if(KEY2==0)
			return KEY2_PRESS;
		else if(KEY3==0)
			return KEY3_PRESS;
		else if(KEY4==0)
			return KEY4_PRESS;	
	}
	else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)	
	{
		key=1;			
	}
	return KEY_UNPRESS;		

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	u8 key=0;
	u8 duty_value=0;

	pwm_init(0XFE,0X33,40,duty_value);//定时时间为0.5ms，PWM周期是40*0.5ms=20ms，初始占空比为0ms
	
	while(1)
	{
		key=key_scan(0);
		if(key==KEY1_PRESS)	
		{
			if(duty_value<=3)
				duty_value+=1;//以0.5ms步进递增45度
			pwm_set_duty_cycle(duty_value);
		}
		else if(key==KEY2_PRESS)
		{
			if(duty_value>=1)
				duty_value-=1;//以0.5ms步进递减
			pwm_set_duty_cycle(duty_value);
		}				
	}	
}
